"""
作用：引入非线性特征，用于隐藏层
特点：x的取值为(负无穷，正无穷)  y的取值(0, 1)
适用于将输出转换为概率或者介于0到1之间的任何其他值的场景
缺点：
1. 梯度消失
2. 不以0为中心点
3. 计算成本高
4. 不是稀疏激活
"""
import numpy as np
import matplotlib.pyplot as plt


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def d_sigmoid(x):
    return sigmoid(x) * (1 - sigmoid(x))


""" 进行画图 """
x = np.linspace(-5, 5, 100)
y = sigmoid(x)
dy = d_sigmoid(x)
plt.subplot(121)
plt.xticks(np.arange(-5, 6, 1))
plt.xlim(-5, 5)
plt.yticks(np.arange(0, 1.1, 0.1))
plt.ylim(0, 1)
plt.plot(x, y)
plt.plot([0, 0], [0, 1], color="black", linewidth="2")

plt.subplot(122)
plt.xticks(np.arange(-5, 6, 1))
plt.xlim(-5, 5)
plt.yticks(np.arange(0, 1.1, 0.1))
plt.ylim(0, 1)
plt.plot(x, dy)
plt.plot([0, 0], [0, 1], color="black", linewidth="2")

plt.show()

# 模拟概率转换
# 实现二分类
x = np.array([50, -4, -3, -2, -1, 11, 12, 13, 14, -10])
y = sigmoid(x)
print(np.round(y, 3))  # [1.    0.018 0.047 0.119 0.269 1.    1.    1.    1.    0.   ]
print(np.where(y > 0.5))  # (array([0, 5, 6, 7, 8]),)
print(x[y > 0.5])  # [50 11 12 13 14]
